package monitormercado.negocio.analise.estrategia;

import java.util.Date;
import java.util.List;

import monitormercado.framework.Analise;
import monitormercado.framework.Estrategia;
import monitormercado.framework.ICombinadorAnalise;
import monitormercado.framework.Sinal;
import monitormercado.negocio.Tick.Tick;
import monitormercado.negocio.analise.indicador.stochastic.GeradorEstocastico;

public class EstrategiaCombinadaMACDEstocastico extends Estrategia {

	private EstrategiaEstocastico estrategiaEstocastico;
	private EstrategiaMACDTripleScreen estrategiaMACDTripleScreen;
	private ICombinadorAnalise combinadorAnalise;

	public EstrategiaCombinadaMACDEstocastico(String nome) {
		super(nome);

	}

	public EstrategiaCombinadaMACDEstocastico(String nome, ICombinadorAnalise combinadorAnalise) {
		super(nome);
		setCombinadorAnalise(combinadorAnalise);
	}

	public ICombinadorAnalise getCombinadorAnalise() {
		if (combinadorAnalise == null) {
			combinadorAnalise = novoCombinadorMACDEstocastico();
			
		}

		return combinadorAnalise;
	}

	public EstrategiaEstocastico getEstrategiaEstocastico() {
		if (estrategiaEstocastico == null) {
			estrategiaEstocastico = new EstrategiaEstocastico(new GeradorEstocastico(), 14, 3);
		}

		return estrategiaEstocastico;
	}

	public EstrategiaMACDTripleScreen getEstrategiaMACD() {
		if (estrategiaMACDTripleScreen == null) {
			estrategiaMACDTripleScreen = new EstrategiaMACDTripleScreen();
		}

		return estrategiaMACDTripleScreen;
	}

	@Override
	public Analise identificarSinais(List<Tick> ticks, Date dataInicial, Date dataFinal) {
		try {
			Analise analiseMACD = getEstrategiaMACD().identificarSinais(ticks, dataInicial, dataFinal);
			Analise analiseEstocastico = getEstrategiaEstocastico().identificarSinais(ticks, dataInicial, dataFinal);
			/*
			 * Combina dois ultimos sinais de analises a partir de um combinador
			 */
			combinarAnalises(analiseMACD, analiseEstocastico);
			return analiseMACD;
		} catch (Exception e) {
			e.printStackTrace();
			return new Analise();
		}
	}

	protected void combinarAnalises(Analise analiseMACD, Analise analiseEstocastico) {
		analiseMACD.combinarUltimo(analiseEstocastico, getCombinadorAnalise());
	}

	/**
	 * {@link ICombinadorAnalise}
	 * 
	 * @return
	 */
	private ICombinadorAnalise novoCombinadorMACDEstocastico() {
		return new ICombinadorAnalise() {

			public Sinal combinar(Sinal umSinal, Sinal outroSinal) {
				if (umSinal.isNaMesmaData(outroSinal) && umSinal.isMesmaConclusao(outroSinal)) {
					//int peso = (umSinal.getPeso().intValue() + outroSinal.getPeso().intValue())/2;
					//umSinal.setPeso(Integer.valueOf(peso));
					umSinal.setPeso(outroSinal.getPeso());
					
					return umSinal;
				} else {
					return null;
				}
			}
		};
	}

	public void setCombinadorAnalise(ICombinadorAnalise combinadorAnalise) {
		this.combinadorAnalise = combinadorAnalise;
	}
}
